package com.wltt.product.frfront.holder;

import com.wltt.product.frfront.config.robot.WlttRobot;
import fairino.Robot;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class RobotHolder {

    /**
     * 机器人对象
     */
    private static WlttRobot robot;

    /**
     * 机器人ip地址
     */
    private static String ROBOT_IP = "192.168.58.2";

    /**
     * 是否已连接，true已连接、false未连接
     */
    private static boolean ROBOT_CONNECTED = false;

    /**
     * 机器人点动锁
     */
    private static boolean ROBOT_IS_BUSY = false;

    /**
     * 机器是否正在运动
     */
    private static boolean ROBOT_MOVING = false;

    /**
     * 机器人是否设置停止焊接
     */
    private static boolean ROBOT_IS_STOP_WELD = false;

    /**
     * 机器人模式，0自动；1手动
     */
    public static int ROBOT_MODEL_STATUS = 1;

    /**
     * 错误信息
     */
    public static Map<Integer, String> ERROR_MAP = new ConcurrentHashMap<>();


//    // 机器人任务线程，理论上只能长度是一个，为了防止被重写，所以设置为数组
//    private static List<Thread> ROBOT_JOB_THREAD = new ArrayList<>();


    /**
     * 错误信息
     */
    private static Boolean isError = false;

    static {
        ERROR_MAP.put(-3, "xmlrpc通讯失败");
        ERROR_MAP.put(-2, "与控制器通讯异常");
        ERROR_MAP.put(-1, "其他错误");
        ERROR_MAP.put(3, "接口参数个数不一致");
        ERROR_MAP.put(4, "接口参数值异常");
        ERROR_MAP.put(11, "程序异常，解析停止");
        ERROR_MAP.put(14, "接口执行失败");
        ERROR_MAP.put(18, "机器人程序正在运行，请先停止");
        ERROR_MAP.put(19, "位姿传感器通信异常");
        ERROR_MAP.put(20, "摆焊未设置工具");
        ERROR_MAP.put(23, "位姿传感器数据获取失败");
        ERROR_MAP.put(25, "数据异常，计算失败");
        ERROR_MAP.put(28, "逆运动学计算结果异常");
        ERROR_MAP.put(30, "不可复位故障，请断电重启控制箱");
        ERROR_MAP.put(31, "急停按钮松开，请断电重启控制箱");
        ERROR_MAP.put(32, "关节超限");
        ERROR_MAP.put(38, "奇异位姿，计算失败");
        ERROR_MAP.put(40, "速度百分比超限");
        ERROR_MAP.put(42, "姿态变化过大");
        ERROR_MAP.put(44, "机器人姿态角超限");
        ERROR_MAP.put(45, "外部轴未激活");
        ERROR_MAP.put(66, "整圆/螺旋线指令中间点1错误");
        ERROR_MAP.put(67, "整圆/螺旋线指令中间点2错误");
        ERROR_MAP.put(68, "整圆/螺旋线指令中间点3错误");
        ERROR_MAP.put(69, "圆弧指令中间点错误");
        ERROR_MAP.put(70, "圆弧指令目标点错误");
        ERROR_MAP.put(74, "直线指令点错误");
        ERROR_MAP.put(75, "通道错误");
        ERROR_MAP.put(76, "等待超时");
        ERROR_MAP.put(84, "焊缝寻位失败");
        ERROR_MAP.put(85, "直线指令错误");
        ERROR_MAP.put(96, "焊丝寻位失败");
        ERROR_MAP.put(99, "安全停止已触发");
        ERROR_MAP.put(101, "机器人未使能");
        ERROR_MAP.put(106, "外部轴未使能");
        ERROR_MAP.put(108, "螺旋线指令起点错误");
        ERROR_MAP.put(112, "给定位姿无法到达");
        ERROR_MAP.put(122, "关节扭矩超限");
        ERROR_MAP.put(151, "关节配置发生变化");
        ERROR_MAP.put(152, "摆焊指令点间距过小");
        ERROR_MAP.put(153, "圆弧指令点间距太小");
    }

    public static WlttRobot getRobot() {
        return robot;
    }

    public static void setRobot(WlttRobot robot) {
        RobotHolder.robot = robot;
    }

    public static String getRobotIp() {
        return ROBOT_IP;
    }

    public static void setRobotIp(String robotIp) {
        ROBOT_IP = robotIp;
    }

    public static boolean isRobotConnected() {
        return ROBOT_CONNECTED;
    }

    public static void setRobotConnected(boolean robotConnected) {
        ROBOT_CONNECTED = robotConnected;
    }

    public synchronized static Boolean setBusy() {
        if (RobotHolder.ROBOT_IS_BUSY) {
            return false;
        }
        RobotHolder.ROBOT_IS_BUSY = true;
        return true;
    }

    public static void setNoBusy() {
        RobotHolder.ROBOT_IS_BUSY = false;
    }

    public static Boolean isBusy() {
        return RobotHolder.ROBOT_IS_BUSY;
    }

    public synchronized static Boolean setRobotMoving() {
        if (RobotHolder.ROBOT_MOVING) {
            return false;
        }
        RobotHolder.ROBOT_MOVING = true;
        return true;
    }

    public synchronized static void setRobotNoMoving() {
        RobotHolder.ROBOT_MOVING = false;
    }

    public static boolean isRobotMoving() {
        return ROBOT_MOVING;
    }

    public static boolean isStopWeld() {
        return ROBOT_IS_STOP_WELD;
    }

    public static void startWeld() {
        ROBOT_IS_STOP_WELD = false;
    }

    public static void stopWeld() {
        ROBOT_IS_STOP_WELD = true;
    }

    public static String getErrorMessage(int main_code) {
        if (ERROR_MAP.containsKey(main_code)) {
            return ERROR_MAP.get(main_code);
        } else  {
            return "未登记的错误信息[" + main_code + "]";
        }
    }

    public static String getErrorMessage(int main_code, int sub_code) {
        if (ERROR_MAP.containsKey(main_code)) {
            return ERROR_MAP.get(main_code);
        } else if (ERROR_MAP.containsKey(sub_code)) {
            return ERROR_MAP.get(sub_code);
        } else {
            return "未登记的错误信息[" + main_code + "] - [" + sub_code + "]";
        }
    }

//    public static void setRobotJobThread(Thread thread) {
//        ROBOT_JOB_THREAD.add(thread);
//    }
//
//    public static void stopJob() {
//        for (Thread thread : ROBOT_JOB_THREAD) {
//            try {
//                if (thread.isAlive()) {
//                    thread.interrupt();
//                }
//            } catch (Exception e) {
//               e.printStackTrace();
//            }
//
//        }
//    }

    public static Boolean getIsError() {
        return isError;
    }

    public static void setIsError(Boolean isError) {
        RobotHolder.isError = isError;
    }
}
